package com.dng.book.util;

import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * Token工具类
 *
 * @author dng
 * @since 2024-01-01
 */
@Slf4j
public class TokenUtil {

    private static final String TOKEN_PREFIX = "token_";
    private static final String USER_ID_SEPARATOR = "_";
    private static final String TIMESTAMP_SEPARATOR = "_";

    /**
     * 生成Token
     *
     * @param username 用户名
     * @return Token字符串
     */
    public static String generateToken(String username) {
        if (StrUtil.isBlank(username)) {
            throw new IllegalArgumentException("用户名不能为空");
        }
        
        String timestamp = String.valueOf(System.currentTimeMillis());
        String uuid = IdUtil.fastSimpleUUID();
        
        String token = TOKEN_PREFIX + username + USER_ID_SEPARATOR + timestamp + TIMESTAMP_SEPARATOR + uuid;
        log.info("生成Token - 用户名: {}, Token: {}", username, token);
        
        return token;
    }

    /**
     * 从Token中提取用户名
     *
     * @param token Token字符串
     * @return 用户名
     */
    public static String extractUsername(String token) {
        if (StrUtil.isBlank(token) || !token.startsWith(TOKEN_PREFIX)) {
            return null;
        }
        
        String tokenContent = token.substring(TOKEN_PREFIX.length());
        String[] parts = tokenContent.split(USER_ID_SEPARATOR);
        
        if (parts.length >= 1) {
            return parts[0];
        }
        
        return null;
    }

    /**
     * 验证Token格式
     *
     * @param token Token字符串
     * @return 是否有效
     */
    public static boolean isValidTokenFormat(String token) {
        if (StrUtil.isBlank(token)) {
            return false;
        }
        
        if (!token.startsWith(TOKEN_PREFIX)) {
            return false;
        }
        
        String tokenContent = token.substring(TOKEN_PREFIX.length());
        String[] parts = tokenContent.split(USER_ID_SEPARATOR);
        
        return parts.length >= 3; // 用户名_时间戳_UUID
    }

    /**
     * 获取Token创建时间
     *
     * @param token Token字符串
     * @return 创建时间戳
     */
    public static Long getTokenTimestamp(String token) {
        if (!isValidTokenFormat(token)) {
            return null;
        }
        
        String tokenContent = token.substring(TOKEN_PREFIX.length());
        String[] parts = tokenContent.split(USER_ID_SEPARATOR);
        
        if (parts.length >= 2) {
            try {
                return Long.parseLong(parts[1]);
            } catch (NumberFormatException e) {
                log.warn("Token时间戳格式错误: {}", parts[1]);
                return null;
            }
        }
        
        return null;
    }
} 